package pe.gob.pnp.servlets;

import com.lowagie.text.Chunk;
import com.lowagie.text.Font;
import com.lowagie.text.Graphic;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfCell;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import pe.gob.pnp.actions.AscensosPersonal;
import pe.gob.pnp.actions.Grado;
import pe.gob.pnp.actions.RtsBean;
import pe.gob.pnp.actions.Usuario;
import pe.gob.pnp.despachadores.GradoDespachador;
import pe.gob.pnp.despachadores.RtsDespachador;
import pe.gob.pnp.digitalizar.beans.PersonalBean;
import pe.gob.pnp.digitalizar.despachadores.PersonalDespachador;
import pe.gob.pnp.libreria.Utiles;

public class PDFrts{

    private static final Logger logger = Logger.getLogger(PDFrts.class);

    public static int DEPE = 30 ;
    public static int DEPO = 28 ;
    public static int DEPSO = 29 ;
    /**DIA**/
    public static int PDF_DIA = 0;
    /**MES*/
    public static int PDF_MES = 1;
    /***ANIO*/
    public static int PDF_ANIO = 2;
    public static final int ACUMULA_UNIVERSIDAD = 500;
    public static final int ACUMULA_EO = 501;
    public static final int ACUMULA_ESO = 502;
    public static final int ACUMULA_OTROSECTOR = 503;
    public static final int ACUMULA_SERVICIOMILITAR = 504;
    public static final int ACUMULA_DOBLETIEMPO = 505;
    
    //private Font fuente = FontFactory.getFont(FontFactory.HELVETICA, 11, Font.BOLD, new Color(255, 150, 200));



    /**
     * Creates our first table
     * @return our first table
     */
    public static PdfPTable createFirstTable(String rts,Usuario us ) {

        BaseFont bf = null;
        try {
            bf = BaseFont.createFont(BaseFont.RESOURCE_PATH +"arial.ttf", BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
        } catch (Exception ex) {
           logger.error(ex.getMessage());
        }
        Font arial14 = new Font(bf, 14);
        Font arial11 = new Font(bf, 11);

        //int area =0;
        String t_area="";

        //Integer edad = 15;
        Integer hasEO = 0 ;
        Integer hasESO = 0 ;

        RtsBean rtsbean = null;
        List<AscensosPersonal> ascensos = null;
        List<AscensosPersonal> bajas =null;
        //crear una tabla para el resumen cabecera
        PdfPTable table = new PdfPTable(4);
        PdfPTable table_computo = new PdfPTable(4);
        PdfPTable table_cabecera = new PdfPTable(4);
        PdfPTable table_bajas = new PdfPTable(4);
        //table.setBorder(0);
        // the cell object
        PdfPCell cell;
      
        /**acumulo para efecto de pension (la suma de abajo)  */
        int[] numeros = new int[3];
        int[] eo_tmp = new int[3];
        int[] dms = null;
        int[] arrayCabPoli = new int[3];
        Grado gr = null;
        try {

            ascensos = RtsDespachador.obtenerAscensosPersona(1, Integer.parseInt(rts), "L");
            bajas = RtsDespachador.obtenerAscensosPersona(2, Integer.parseInt(rts), "L");
            rtsbean = RtsDespachador.obtenerRTSId(Integer.parseInt(rts));
            PersonalBean policia = PersonalDespachador.obtenerPersonalPolicial(rtsbean.getNpepo_identificador());
            //TODO : segun el policia al que se evalue en este RTS
            t_area = policia.getNgrad_tipogradoOficina();
            HashMap<String,int[]> cabecera = new HashMap<String,int[]>();
            //area = policia.getNdepeIdentificador();
            
            //TODO: obtener  la oficina de la persona en session
            // session.put("usuario", this);
            //con eso obtengo el usuario en session, luego debo obtener su oficina

        cell= new PdfPCell(new Phrase("REF. : Exp. Adm  N° " + rtsbean.getCexpe_codigoarchivo() ,arial11));
        cell.setColspan(4);
        cell.setHorizontalAlignment(PdfPCell.ALIGN_RIGHT);
        cell.setPadding(10f);
        cell.setBorder(0);
        table_cabecera.addCell(cell);
            //texto subrayado
             Chunk chunk = new Chunk("CERTIFICADO E INFORME Nº "+   rtsbean.getNrtpe_identificador()+ "-" + Utiles.DateToString( rtsbean.getDrtpe_fechacreacion(), "yyyy") +"-DIRPEN-PNP/"+t_area + "-SRTS",arial11);
             chunk.setUnderline(0.2f, -2f);
             Paragraph paragraph = new Paragraph("");
             paragraph.add(chunk);

        cell = new PdfPCell(paragraph);
        cell.setColspan(4);
        cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
        cell.setBorder(0);
        table_cabecera.addCell(cell);
        //logger.debug(area + " - depe " +  DEPE);
        //logger.debug(area + " - depo " +  DEPO);
        //logger.debug(area + " - depso" +  DEPSO);
        String tipoGrado = policia.getNgrad_tipogrado() == null ? "NN" : policia.getNgrad_tipogrado() ;
        cell= new PdfPCell(new Phrase("EL JEFE DEL DEPARTAMENTO DE PENSIONES DE " + ( tipoGrado.equals("EE") ? "ESPECIALISTAS Y EMPLEADOS CIVILES" : tipoGrado.equals("O") ? "OFICIALES" : tipoGrado.equals("NN") ? "SIN GRADO" : "SUB OFICIALES"  )+ " PNP, QUE SUSCRIBE",arial11));
        cell.setColspan(4);
        cell.setHorizontalAlignment(PdfPCell.ALIGN_JUSTIFIED);
        cell.setPadding(10f);
        cell.setBorder(0);
        table_cabecera.addCell(cell);
        cell = new PdfPCell(new Phrase("CERTIFICA:",arial11));
        cell.setColspan(4);
        cell.setBorder(0);
        table_cabecera.addCell(cell);
            //gr = GradoDespachador.obtenerGrado( policia.getGrado() );
        cell= new PdfPCell(new Phrase("Que, el (la) "+ policia.getGrado() +" (R) " + policia.getNombreCompleto()+", registra:",arial11));
        cell.setPadding(5f);
        cell.setColspan(4);
        cell.setBorder(0);
        table_cabecera.addCell(cell);

            if (ascensos != null && ascensos.size() > 0) {

                boolean acumulacion = false;
                /**Variable para acumular el tiempo de cara rubro que va en la cabecera
                 Para efecto de COMPENSACION
                 */
                

                //===================
                //SOLO ASCENSOS
                //===================
                table_computo.addCell( agregaCeldaLineaCompleta() );
                cell = new PdfPCell(new Phrase("COMPUTO GENERAL DE TIEMPO DE SERVICIOS EN LA PNP: ",arial11));
                cell.setBorder(PdfPCell.NO_BORDER);
                cell.setColspan(4);
                table_computo.addCell(cell);
                for (AscensosPersonal ap : ascensos) {

                    if(ap.getNhias_tipo()!=1){
                        acumulacion = true;
                        continue;
                    }

                    numeros[PDF_DIA] += ap.getNhias_dias();
                    numeros[PDF_MES] += ap.getNhias_meses();
                    numeros[PDF_ANIO] += ap.getNhias_anios();
                  
                    gr = GradoDespachador.obtenerGrado( ap.getNgrad_identificador() );
                    if(cabecera.get( gr.getNgrgr_identificador().toString() )!=null){
                        dms = cabecera.get( gr.getNgrgr_identificador().toString() );
                        dms[PDF_DIA] += ap.getNhias_dias();
                        dms[PDF_MES] += ap.getNhias_meses();
                        dms[PDF_ANIO] += ap.getNhias_anios();
                    }else{
                        dms  = new int[3];
                        dms[PDF_DIA] = ap.getNhias_dias();
                        dms[PDF_MES] = ap.getNhias_meses();
                        dms[PDF_ANIO] = ap.getNhias_anios();
                    }
                     cabecera.put(gr.getNgrgr_identificador().toString(),  dms );
                    
                   
                    cell = new PdfPCell(new Phrase( Utiles.DateToString( ap.getDhias_fechainicio(),"yyyy") +" - " + Utiles.DateToString(ap.getDhias_fechaascenso(),"yyyy") ,arial11));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table_computo.addCell(cell);
                    cell = new PdfPCell(new Phrase(Utiles.DateToString( ap.getDhias_fechainicio(),"ddMMM").toUpperCase() + " - " + Utiles.DateToString( ap.getDhias_fechaascenso(),"ddMMM").toUpperCase(),arial11 ));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table_computo.addCell(cell);
                    
                    //TODO: poner grado nombre corto
                    cell = new PdfPCell(new Phrase(gr.getCgradNombrecorto(),arial11));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table_computo.addCell(cell);
                    cell = new PdfPCell(new Phrase( imprimeTiempo( ap.getNhias_anios()  , ap.getNhias_meses(),  ap.getNhias_dias() ),arial11));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table_computo.addCell(cell);
                }

                //NO PINTA NADA SINO SUMA PARA HACER ALCULOS
                numeros= acomodaTtoal( numeros[PDF_DIA],  numeros[PDF_MES],  numeros[PDF_ANIO]);
               
                cell = new PdfPCell(new Phrase( "" ));
                cell.setBorder(PdfPCell.NO_BORDER);
                table_computo.addCell(cell);
                cell = new PdfPCell(new Phrase(""));
                cell.setBorder(PdfPCell.NO_BORDER);
                table_computo.addCell(cell);
                if( bajas.size()>0 || acumulacion)
                    cell = new PdfPCell(new Phrase("SUB TOTAL.....",arial11));
                else
                    cell = new PdfPCell(new Phrase("TOTAL.....",arial11));
                cell.setBorder(PdfPCell.NO_BORDER);
                table_computo.addCell(cell);
                chunk = new Chunk(imprimeTiempo(numeros[PDF_ANIO], numeros[PDF_MES], numeros[PDF_DIA]),arial11);
                chunk.setUnderline(0.2f, -2f);
                paragraph = new Paragraph("");
                paragraph.add(chunk);
                cell = new PdfPCell(paragraph);
                cell.setBorder(PdfPCell.NO_BORDER);
                //cell.setBorderColorLeft(Color.WHITE);
                //cell.setBorderColorRight(Color.WHITE);
                table_computo.addCell(cell);

                int anio_efecto = numeros[PDF_ANIO];
                int mes_efecto = numeros[PDF_MES];

                logger.debug("ANIOS PARA CONTAR "  + anio_efecto);
                logger.debug("MESES PARA CONTAR "  + mes_efecto);
                //===========================================
                
                //===================
                //SOLO ACUMULACIONES
                //===================

                if(acumulacion){
                     //AGREGA LINEA
                 //   table_computo.addCell( agregaCeldaLineaCompleta() );

                    chunk = new Chunk("ACUMULACIONES:",arial11);
                    chunk.setUnderline(0.2f, -2f);
                    paragraph = new Paragraph("");
                    paragraph.add(chunk);
                    cell = new PdfPCell(paragraph);
                    cell.setBorder(PdfPCell.NO_BORDER);
                    cell.setColspan(4);
                    table_computo.addCell(cell);

                    for (AscensosPersonal ap : ascensos) {
                        if(ap.getNhias_tipo()!=3){
                            continue;
                        }

                        gr = GradoDespachador.obtenerGrado( ap.getNgrad_identificador() );

                        //policia.getGrado();// grado de retiro del policia
                        // -- verifico el sexo
                        //9.	Cuando el Computo General de Tiempo de Servicio es IGUAL O MAYOR A 20 AÑOS,
                        //-- la Formación Profesional Universitaria se le acumula solo a los oficiales de servicios.
                        //-----////Sub oficiales nunca acumula univerdidad
                        //-----////oficial de armas nunca acumula universidad
                        //-----////Oficial de servicios acumula universidad cuando tiene >= de 20
                        //-----////Especialista tecnico nunca acumula universidad
                        //10.	Si han estudiado como alumno ESO y también a estudiado como cadete en la EO, solo se le reconoce para acumulación el de EO.
                        //11.	Si se quiere acumular doble tiempo de servicios, se puede hacer en cualquier tiempo o años.
                        //-- 12.	Servicio militar obligatorio y servicio prestado en otro sector del estado a partir de los 20 años en adelante si se acumulan, los años que sean, pero si tienes menos que 20 años  no se acumula.
                        //13.	Cuando el Cómputo General de Tiempo de Servicio es MENOR a 20 años, la formación universitaria o en la escuela de policías no se acumulan como años de servicios, ya que por ley está establecido.
                        //-- Para hombre: <15 no acumula nada,pension compensatoria; >= 15 y <20 pension no renovable, no acumula nada; >=20 acumula todo
                        //-- Para mujer : <12.5 no acumula nada,pension compensatoria; >= 12.5 y <17.5 pension no renovable, no acumula nada; >=17.5 acumula todo
                            logger.debug("---------"+policia.getCpers_sexo()+"--------------------------");
                         if( Utiles.nullToBlank( policia.getCpers_sexo() ).equals("MASCULINO")){
                            logger.debug("SEXO MASCULINO, anios " +anio_efecto);
                             // pension no renovable, no acumula nada;
                             if(ap.getNgrad_identificador() == ACUMULA_DOBLETIEMPO ){
                                numeros[PDF_DIA] += ap.getNhias_dias();
                                numeros[PDF_MES] += ap.getNhias_meses();
                                numeros[PDF_ANIO] += ap.getNhias_anios();
                                logger.debug("Menor a 15 anios. Doble Tiempo");
                             } else if( anio_efecto >= 20){
                                 //acumula todo
                                 //Formación Profesional Universitaria se le acumula solo a los oficiales de servicios.
                                 if( ap.getNgrad_identificador() == ACUMULA_UNIVERSIDAD ){
                                     if( policia.getNgrad_tipooficial().equals("S") ){
                                        numeros[PDF_DIA] += ap.getNhias_dias();
                                        numeros[PDF_MES] += ap.getNhias_meses();
                                        numeros[PDF_ANIO] += ap.getNhias_anios();
                                     }
                                 }else{
                                     //queda EO
                                     if( ap.getNgrad_identificador() == ACUMULA_EO || ap.getNgrad_identificador() == ACUMULA_ESO ){
                                         if(  hasESO == 1 ){
                                             //si entro aqui es porque he tenido ESO y ahora registro EO, solo deberia quedar EO, resto el tiempo de ESO
                                             logger.debug("ya he tenido ESO y ahora registro EO, solo deberia quedar EO, resto el tiempo de ESO");
                                             numeros[PDF_DIA] -= eo_tmp[PDF_DIA] ;
                                             numeros[PDF_MES] -= eo_tmp[PDF_MES] ;
                                             numeros[PDF_ANIO] -= eo_tmp[PDF_ANIO] ;
                                         }
                                         if(  hasEO == 1 ){
                                             //si ya tengo EO, no acumulare ESO
                                            logger.debug("si ya tengo EO, no acumulare ESO");
                                            //salir del if
                                         }else{
                                             numeros[PDF_DIA] += ap.getNhias_dias();
                                             numeros[PDF_MES] += ap.getNhias_meses();
                                             numeros[PDF_ANIO] += ap.getNhias_anios();

                                             eo_tmp[PDF_DIA]= ap.getNhias_dias();
                                             eo_tmp[PDF_MES]= ap.getNhias_meses();//creo que por error puse dia
                                             eo_tmp[PDF_ANIO]= ap.getNhias_anios();//creo que por error puse dia

                                             if(ap.getNgrad_identificador() == ACUMULA_EO ){ hasEO = 1 ; logger.debug("He acumulado EO"); }
                                             if(ap.getNgrad_identificador() == ACUMULA_ESO ){ hasESO = 1; logger.debug("HE acumulado ESO");}
                                         }
                                     }else{
                                         logger.debug("diferente de EO o ESO. Acumulo");
                                         numeros[PDF_DIA] += ap.getNhias_dias();
                                         numeros[PDF_MES] += ap.getNhias_meses();
                                         numeros[PDF_ANIO] += ap.getNhias_anios();
                                     }
                                 }

                             }
                         }else{  /// FEMENINO
                            logger.debug("SEXO FEMENINO, anios " +anio_efecto);
                            // pension no renovable, no acumula nada;
                             if(ap.getNgrad_identificador() == ACUMULA_DOBLETIEMPO ){
                                numeros[PDF_DIA] += ap.getNhias_dias();
                                numeros[PDF_MES] += ap.getNhias_meses();
                                numeros[PDF_ANIO] += ap.getNhias_anios();
                                logger.debug("Menor a 15 anios. Doble Tiempo, acumulo numeros");
                             } else if( anio_efecto > 17 || ( anio_efecto == 17  && mes_efecto >= 6 ) ){
                                 //acumula todo
                                 logger.debug("acumula todo ..validando");
                                 //Formación Profesional Universitaria se le acumula solo a los oficiales de servicios.
                                 if( ap.getNgrad_identificador() == ACUMULA_UNIVERSIDAD ){
                                     logger.debug("acumula universidad");
                                     if( policia.getNgrad_tipooficial().equals("S") ){
                                         logger.debug("Ngrad_tipooficial = S");
                                        numeros[PDF_DIA] += ap.getNhias_dias();
                                        numeros[PDF_MES] += ap.getNhias_meses();
                                        numeros[PDF_ANIO] += ap.getNhias_anios();
                                     }
                                 }else{
                                     //queda EO
                                      logger.debug("Ngrad_tipooficial != S");
                                     if( ap.getNgrad_identificador() == ACUMULA_EO || ap.getNgrad_identificador() == ACUMULA_ESO ){
                                        logger.debug("POR ACUMULAR ESO o ESO");
                                         if(  hasESO == 1 ){
                                             //si entro aqui es porque he tenido ESO y ahora registro EO, solo deberia quedar EO, resto el tiempo de ESO
                                             logger.debug("ya he tenido ESO y ahora registro EO, solo deberia quedar EO, resto el tiempo de ESO  resto a numeros");
                                             numeros[PDF_DIA] -= eo_tmp[PDF_DIA] ;
                                             numeros[PDF_MES] -= eo_tmp[PDF_MES] ;
                                             numeros[PDF_ANIO] -= eo_tmp[PDF_ANIO] ;
                                         }
                                         if(  hasEO == 1 ){
                                             //si ya tengo EO, no acumulare ESO
                                            logger.debug("si ya tengo EO, no acumulare ESO numeros ni eo_tmp");
                                            //salir del if
                                         }else{
                                            logger.debug("acumula EO o ESO");
                                             numeros[PDF_DIA] += ap.getNhias_dias();
                                             numeros[PDF_MES] += ap.getNhias_meses();
                                             numeros[PDF_ANIO] += ap.getNhias_anios();
                        
                                             logger.debug("acumulo numeros y eo_tmp");
                                             eo_tmp[PDF_DIA]= ap.getNhias_dias();
                                             eo_tmp[PDF_MES]= ap.getNhias_meses();//creo que por error puse dia
                                             eo_tmp[PDF_ANIO]= ap.getNhias_anios();//creo que por error puse dia

                                             if(ap.getNgrad_identificador() == ACUMULA_EO ){ hasEO = 1 ; logger.debug("He acumulado EO"); }
                                             if(ap.getNgrad_identificador() == ACUMULA_ESO ){ hasESO = 1; logger.debug("HE acumulado ESO");}
                                         }
                                     }else{
                                         logger.debug("diferente de EO o ESO. Acumulo numeros");
                                         numeros[PDF_DIA] += ap.getNhias_dias();
                                         numeros[PDF_MES] += ap.getNhias_meses();
                                         numeros[PDF_ANIO] += ap.getNhias_anios();
                                     }
                                 }

                             }else{
                             logger.debug("no cumple con validacion de edad");
                             }
                            logger.debug("terminau n ELSE, espero haber acumulado numeros ");
                        }
                            logger.debug("sea hombre o mujer ya he terminado");
                        /*

                        numeros[PDF_DIA] += ap.getNhias_dias();
                        numeros[PDF_MES] += ap.getNhias_meses();
                        numeros[PDF_ANIO] += ap.getNhias_anios();

                        */
                            logger.debug("Preparo para acumular en ACUMULACIONES");
                        if(cabecera.get( gr.getNgrgr_identificador().toString() )!=null){
                            dms = cabecera.get( gr.getNgrgr_identificador().toString() );
                            dms[PDF_DIA] += ap.getNhias_dias();
                            dms[PDF_MES] += ap.getNhias_meses();
                            dms[PDF_ANIO] += ap.getNhias_anios();
                            logger.debug("ACUMULO XQ YA TENIA dms");
                        }else{
                            dms  = new int[3];
                            dms[PDF_DIA] = ap.getNhias_dias();
                            dms[PDF_MES] = ap.getNhias_meses();
                            dms[PDF_ANIO] = ap.getNhias_anios();
                            logger.debug("ACUMULO PRIMERA VEZ dms");
                        }
                        cabecera.put(gr.getNgrgr_identificador().toString(),  dms );

                        cell = new PdfPCell(new Phrase(" * "+gr.getCgradDescripcion() ,arial11));
                        cell.setBorder(PdfPCell.NO_BORDER);
                        cell.setColspan(3);
                        cell.setPaddingTop(06f);
                        table_computo.addCell(cell);

                        cell = new PdfPCell(new Phrase( "" ));
                        cell.setBorder(PdfPCell.NO_BORDER);
                        table_computo.addCell(cell);
                        //Primera linea
                        cell = new PdfPCell(new Phrase("   "+ ap.getChias_resolucion(),arial11 ));
                        cell.setBorder(PdfPCell.NO_BORDER);
                        cell.setColspan(3);
                        table_computo.addCell(cell);
                      
                        cell = new PdfPCell(new Phrase(imprimeTiempo( ap.getNhias_anios() , ap.getNhias_meses(), ap.getNhias_dias() ) ,arial11 ));
                        cell.setBorder(PdfPCell.NO_BORDER);
                        table_computo.addCell(cell);
                        //Segunda linea
                        logger.debug("fin de acumulacion " + imprimeTiempo( ap.getNhias_anios() , ap.getNhias_meses(), ap.getNhias_dias() ) );
                    }

                    //ACUMULA y suma los dias meses i anios, no pinta por eos conservo el orden 0, 1, 2
                    numeros=acomodaTtoal( numeros[PDF_DIA],  numeros[PDF_MES],  numeros[PDF_ANIO]);
         
                    cell = new PdfPCell(new Phrase( "" ));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table_computo.addCell(cell);
                    cell = new PdfPCell(new Phrase(""));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table_computo.addCell(cell);
                    if(bajas.size()>0)
                        cell = new PdfPCell(new Phrase("SUB TOTAL.....",arial11));
                    else
                        cell = new PdfPCell(new Phrase("TOTAL.....",arial11));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table_computo.addCell(cell);
                    chunk = new Chunk(imprimeTiempo(numeros[PDF_ANIO], numeros[PDF_MES], numeros[PDF_DIA]),arial11);
                    chunk.setUnderline(0.2f, -2f);
                    paragraph = new Paragraph("");
                    paragraph.add(chunk);
                    cell = new PdfPCell(paragraph);
                    cell.setBorder(PdfPCell.NO_BORDER);
                    //cell = new PdfPCell(new Phrase( imprimeTiempo(numeros[PDF_ANIO], numeros[PDF_MES], numeros[PDF_DIA])));
                    //cell.setBorderColorLeft(Color.WHITE);
                    //cell.setBorderColorRight(Color.WHITE);
                    table_computo.addCell(cell);


                }

                //AGREGA LINEA
              //  table.addCell( agregaCeldaLineaCompleta() );

            }

            //===================
            //SOLO Bajas
            //===================
            //table_computo.addCell( agregaCeldaLineaCompleta() );
            table_bajas.addCell( agregaCeldaLineaCompleta() );

            chunk = new Chunk("DEDUCCIONES:",arial11);
            chunk.setUnderline(0.2f, -2f);
            paragraph = new Paragraph("");
            paragraph.add(chunk);
            cell = new PdfPCell(paragraph);
            cell.setBorder(PdfPCell.NO_BORDER);
            cell.setColspan(4);
            table_computo.addCell(cell);

            chunk = new Chunk("BAJAS INTERMEDIAS:",arial11);
            chunk.setUnderline(0.2f, -2f);
            paragraph = new Paragraph("");
            paragraph.add(chunk);
            cell = new PdfPCell(paragraph);
            cell.setBorder(PdfPCell.NO_BORDER);
            cell.setHorizontalAlignment(PdfCell.ALIGN_CENTER);
            cell.setColspan(4);
            table_bajas.addCell(cell);

            if (bajas != null && bajas.size()>0) {
                
                for (AscensosPersonal bj : bajas) {
                    logger.debug("===================BAJAS INTERMEDIAS =====================================");
                    logger.debug("Inluir en el calculo? " + bj.getBhias_inluido() );
                    if(bj.getBhias_inluido()==1){
                        numeros[PDF_DIA] -= bj.getNhias_dias();
                        numeros[PDF_MES] -= bj.getNhias_meses();
                        numeros[PDF_ANIO] -= bj.getNhias_anios();
                    }
                    
                    logger.debug("BJ = " + bj);
                    logger.debug("bj.grd identifi " + bj.getNgrad_identificador());
                    gr = GradoDespachador.obtenerGrado( bj.getNgrad_identificador() );
                    logger.debug("Buscando grado para deduccion ");
                    if( gr != null ) {
                        logger.debug("Tiene grado, descuento en la cabecera : " + gr.getCgradDescripcion());
                        logger.debug(" gr.getNgrgr_identificador = " + gr.getNgrgr_identificador());
                        if(cabecera.get( gr.getNgrgr_identificador().toString() )!=null){
                            dms = cabecera.get( gr.getNgrgr_identificador().toString() );
                            logger.debug("Ya existia el grado grupo , lo resto ");
                            logger.debug("ANTES : D ="+dms[PDF_DIA]+" ; M = " + dms[PDF_MES]+ "; A = "+dms[PDF_ANIO] );
                            logger.debug("RESTO : D ="+bj.getNhias_dias()+" ; M = " + bj.getNhias_meses()+ "; A = "+bj.getNhias_anios() );
                            dms[PDF_DIA] -= Utiles.nullToZero(bj.getNhias_dias() );
                            dms[PDF_MES] -= Utiles.nullToZero(bj.getNhias_meses() );
                            dms[PDF_ANIO] -= Utiles.nullToZero(bj.getNhias_anios() );
                            dms=acomodaTtoal( dms[PDF_DIA],  dms[PDF_MES],  dms[PDF_ANIO]);
                            logger.debug("DESPUES : D ="+dms[PDF_DIA]+" ; M = " + dms[PDF_MES]+ "; A = "+dms[PDF_ANIO] );
                        }else{
                            logger.debug("no existia el gradogrupo  en la cabecera");
                            logger.debug("ANTES : D ="+dms[PDF_DIA]+" ; M = " + dms[PDF_MES]+ "; A = "+dms[PDF_ANIO] );
                            logger.debug("RESTO : D ="+bj.getNhias_dias()+" ; M = " + bj.getNhias_meses()+ "; A = "+bj.getNhias_anios() );
                            dms  = new int[3];
                            dms[PDF_DIA] -= Utiles.nullToZero( bj.getNhias_dias() );
                            dms[PDF_MES] -= Utiles.nullToZero( bj.getNhias_meses() );
                            dms[PDF_ANIO] -= Utiles.nullToZero( bj.getNhias_anios() );
                            dms=acomodaTtoal( dms[PDF_DIA],  dms[PDF_MES],  dms[PDF_ANIO]);
                            logger.debug("DESPUES : D ="+dms[PDF_DIA]+" ; M = " + dms[PDF_MES]+ "; A = "+dms[PDF_ANIO] );
                        }
                        //dms=acomodaTtoal( dms[PDF_DIA],  dms[PDF_MES],  dms[PDF_ANIO]);
                        cabecera.put(gr.getNgrgr_identificador().toString(),  dms );
                    }
                    logger.debug("Motivo baja " + bj.getChias_motivobaja() );
                    cell = new PdfPCell(new Phrase( bj.getChias_motivobaja() ,arial11));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    cell.setColspan(3);
                    table_computo.addCell(cell);
                    cell = new PdfPCell(new Phrase(imprimeTiempo( bj.getNhias_anios() , bj.getNhias_meses(), bj.getNhias_dias() ) ,arial11));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table_computo.addCell(cell);
                    
                    cell = new PdfPCell(new Phrase( ""+bj.getChias_resolucion(),arial11 ));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    cell.setColspan(4);
                    table_bajas.addCell(cell);
                }
                ////ACUMULA y suma los dias meses i anios, no pinta por eos conservo el orden 0, 1, 2
                numeros=acomodaTtoal( numeros[PDF_DIA],  numeros[PDF_MES],  numeros[PDF_ANIO]);
                
                cell = new PdfPCell(new Phrase( "" ));
                cell.setBorder(PdfPCell.NO_BORDER);
                table_computo.addCell(cell);
                cell = new PdfPCell(new Phrase(""));
                cell.setBorder(PdfPCell.NO_BORDER);
                table_computo.addCell(cell);
                cell = new PdfPCell(new Phrase("TOTAL.....",arial11));
                cell.setBorder(PdfPCell.NO_BORDER);
                table_computo.addCell(cell);
                chunk = new Chunk(imprimeTiempo(numeros[PDF_ANIO], numeros[PDF_MES], numeros[PDF_DIA]),arial11);
                chunk.setUnderline(0.2f, -2f);
                paragraph = new Paragraph("");
                paragraph.add(chunk);
                cell = new PdfPCell(paragraph);
                cell.setBorder(PdfPCell.NO_BORDER);

                //cell = new PdfPCell(new Phrase( imprimeTiempo(numeros[PDF_ANIO], numeros[PDF_MES], numeros[PDF_DIA])));
                //cell.setBorderColorLeft(Color.WHITE);
                //cell.setBorderColorRight(Color.WHITE);
                table_computo.addCell(cell);
            }else{
            //Agregar texto
                cell = new PdfPCell(new Phrase(" * NO REGISTRA "));
                cell.setBorder(PdfPCell.NO_BORDER);
                cell.setColspan(4);
                table_computo.addCell(cell);
                cell.setHorizontalAlignment(PdfCell.ALIGN_CENTER);
                table_bajas.addCell(cell);
            }
            //table_computo.addCell( agregaCeldaLineaCompleta() );
            table_bajas.addCell( agregaCeldaLineaCompleta() );
            //acomodaTtoal( anio,  mes,  dia);
          
            //========== TEXTO PIE DE COMPUTO GENERAL
            StringBuilder txt1 = new StringBuilder();
            txt1.append("SON: ").append( Utiles.convertNumberToLetter( numeros[PDF_ANIO] )).append("(").append(numeros[PDF_ANIO]).append(") años, ").append( Utiles.convertNumberToLetter( numeros[PDF_MES] )).append(" (").append( numeros[PDF_MES]).append(") meses y ").append( Utiles.convertNumberToLetter( numeros[PDF_DIA] )).append("(").append( numeros[PDF_DIA]).append(") días, ");
            txt1.append(" de servicios prestados al Estado de forma ");
            if (bajas != null && bajas.size()>0)
                txt1.append("INTERRUMPIDA");
            else
                txt1.append("ININTERRUMPIDA");

            //NUEVAMENTE LA VALIDACION DE LA EDAD I SEXO
            //SI ES MAYOR A 15 (hombres) 12.5 (mujeres)
            //TODO obtener sexo
            //lo hago aka para ver si con las acumulaciones supera o no la edad  limite
            logger.debug( "SEXO OFICIAL = "+policia.getCpers_sexo());
            if(policia.getCpers_sexo().equals("MASCULINO")){
                logger.debug("EFECTO DE PENSION O COMPE =  (["+numeros[PDF_ANIO]+"] >= 15)" + (numeros[PDF_ANIO] >= 15) );
                 if(numeros[PDF_ANIO] >= 15){
                     logger.debug("PENSION");
                    txt1.append(", PARA EFECTO DE PENSION. ");
                 }else{
                    logger.debug("COMPENSION");
                    txt1.append(", PARA EFECTO DE COMPENSACION O PENSIÓN.");
                 }
             }else{
                logger.debug("EFECTO DE PENSION O COMPE =  (["+numeros[PDF_ANIO]+"] >= 12)" + (numeros[PDF_ANIO] >= 12) );
                if(numeros[PDF_ANIO] > 12 || ( numeros[PDF_ANIO] >= 12 && numeros[PDF_MES] >= 6 ) ){
                    txt1.append(", PARA EFECTO DE PENSION.");
                    logger.debug("PENSION");
                 }else{
                    txt1.append(", PARA EFECTO DE COMPENSACION O PENSIÓN.");
                     logger.debug("COMPENSION");
                 }
             }

            cell = new PdfPCell(new Phrase(txt1.toString(),arial11));
            cell.setHorizontalAlignment(PdfCell.ALIGN_JUSTIFIED);
            cell.setBorder(PdfPCell.NO_BORDER);
            cell.setPadding(10f);
            cell.setColspan(4);
            table_computo.addCell(cell);

            cell = new PdfPCell(table_bajas);
            cell.setColspan(4);
            cell.setBorder(PdfPCell.NO_BORDER);
            table_computo.addCell(cell);

            cell = new PdfPCell(new Phrase(Utiles.nullToBlank( rtsbean.getNrtpe_parrafo() ),arial11));
            cell.setBorder(PdfPCell.NO_BORDER);
            cell.setHorizontalAlignment(PdfCell.ALIGN_JUSTIFIED);
            cell.setPadding(10f);
            cell.setColspan(4);
            table_computo.addCell(cell);

            //+================================================
            // GENERO LA CABECERA
            //================================================
             Set<String> ll= cabecera.keySet();
                cell = new PdfPCell(new Phrase(""));
                cell.setColspan(3);
                cell.setBorder(PdfPCell.NO_BORDER);
                table.addCell(cell);
                cell = new PdfPCell(new Phrase( "Año - Mes - Dia ",arial11));
                cell.setBorder(PdfPCell.NO_BORDER);
                table.addCell(cell);


                for(String cab : ll){
                    dms = cabecera.get( cab );

                    // TODO : mover esto par que ahroa lo imprima luego de
                    // que se hallan hecho los descuentos.

                    //PdfPCell cell;
                    cell = new PdfPCell(new Phrase(GradoDespachador.obtenerGrupoGrado( Integer.parseInt(cab) ).getCgrgr_descripcion(),arial11));
                    cell.setColspan(3);
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table.addCell(cell);
                    dms= acomodaTtoal( dms[PDF_DIA],  dms[PDF_MES],  dms[PDF_ANIO]);

                    //acumulo en el resume solo de policias
                    logger.debug("CAB = " + cab);
                    if(cab.equals("4") || cab.equals("5")|| cab.equals("6")){
                        logger.debug( "ANIO " + dms[PDF_ANIO] + " meses " + dms[PDF_MES] +" dias " + dms[PDF_DIA]);
                        arrayCabPoli[PDF_DIA] += dms[PDF_DIA];
                        arrayCabPoli[PDF_MES] += dms[PDF_MES];
                        arrayCabPoli[PDF_ANIO] += dms[PDF_ANIO];
                    }
                    arrayCabPoli= acomodaTtoal( arrayCabPoli[PDF_DIA],  arrayCabPoli[PDF_MES],  arrayCabPoli[PDF_ANIO]);
                    cell = new PdfPCell(new Phrase( imprimeTiempoResumen(dms[PDF_ANIO], dms[PDF_MES], dms[PDF_DIA]),arial11));
                    cell.setBorder(PdfPCell.NO_BORDER);
                    table.addCell(cell);

                }

                cell = new PdfPCell(new Phrase( "TOTAL DE SERVICIOS REALES Y EFECTIVOS EN LA PNP APORTADOS AL FOSEROF Y/O FOSERSOE" ,arial11));
                cell.setColspan(4);
                cell.setBorder(PdfPCell.NO_BORDER);
                table.addCell(cell);
                cell = new PdfPCell(new Phrase(  Utiles.convertNumberToLetter( arrayCabPoli[PDF_ANIO] +"") + " ("+arrayCabPoli[PDF_ANIO]+") AÑOS,  " + Utiles.convertNumberToLetter( arrayCabPoli[PDF_MES]+"" ) + "("+arrayCabPoli[PDF_MES]+") MESES Y " + Utiles.convertNumberToLetter( arrayCabPoli[PDF_DIA] +"" ) +"("+arrayCabPoli[PDF_DIA]+") DIAS." ,arial11));
                cell.setColspan(4);
                cell.setBorder(PdfPCell.NO_BORDER);
                table.addCell(cell);
                /*
                cell = new PdfPCell(new Phrase( imprimeTiempoResumen(arrayCabPoli[PDF_ANIO], arrayCabPoli[PDF_MES], arrayCabPoli[PDF_DIA])));
                cell.setBorder(PdfPCell.NO_BORDER);
                table.addCell(cell);
                  */

                //=========================================================
                //=======FIN DE CABECERA =============================
                //================================================

                //como table ya tiene la cabcera, ahora si agrego el computo
                
            cell = new PdfPCell(table_computo);
            cell.setColspan(4);
            cell.setBorder(PdfPCell.NO_BORDER);
            table.addCell(cell);

            cell = new PdfPCell(table);
            cell.setColspan(4);
            cell.setBorder(PdfPCell.NO_BORDER);
            table_cabecera.addCell(cell);
            
            //====================
            //PIE DE PAGINA
            //====================
           /*
            Esto es de la caja que graba el RTS, el campo cgrnade donde aparece por defecto el teimp en letras
            cell = new PdfPCell(new Phrase( rtsbean.getCrtpe_resolucion() ));
            cell.setColspan(4);
            cell.setPadding(10f);
            cell.setBorder(PdfPCell.NO_BORDER);
            table_cabecera.addCell(cell);
            */
            cell = new PdfPCell(new Phrase( "\tSe expide la presente, para fines administrativos en la DIRECFIN, FOSEROF, FOSERSOES, AMOF, FOSCECMI Y FAE PNP",arial11 ));
            cell.setColspan(4);
            cell.setPadding(10f);
            cell.setHorizontalAlignment(PdfCell.ALIGN_JUSTIFIED);
            cell.setBorder(PdfPCell.NO_BORDER);
            table_cabecera.addCell(cell);

            cell = new PdfPCell(new Phrase( "Rimac, " + Utiles.DateToString( new Date() , "dd MMMMMM yyyy" ),arial11 ));
            cell.setHorizontalAlignment(PdfPCell.ALIGN_RIGHT);
            cell.setColspan(4);
            cell.setPaddingTop(20f);
            cell.setPaddingBottom(50f);
            cell.setPadding(10f);
            cell.setBorder(PdfPCell.NO_BORDER);
            table_cabecera.addCell(cell);

            
            cell = new PdfPCell(new Phrase( "VISTO BUENO DEL:" ,arial11));
            cell.setPaddingTop(10f);
            cell.setPaddingBottom(20f);///espacio debajo
            cell.setColspan(2);
            cell.setHorizontalAlignment(PdfCell.ALIGN_CENTER);
            cell.setBorder(PdfPCell.NO_BORDER);
            table_cabecera.addCell(cell);

            cell = new PdfPCell(new Phrase( "FORMULADO POR:" ,arial11));
            cell.setPaddingTop(10f);//espacio arriba
            cell.setPaddingBottom(20f);//espaciado abajo
            cell.setColspan(2);
            cell.setHorizontalAlignment(PdfCell.ALIGN_CENTER);
            cell.setBorder(PdfPCell.NO_BORDER);
            table_cabecera.addCell(cell);
            
            cell = new PdfPCell(new Phrase( "__________________" ));
             cell.setPadding(15f);//espaciado a todos los lados
            cell.setColspan(2);
            cell.setHorizontalAlignment(PdfCell.ALIGN_CENTER);
            cell.setBorder(PdfPCell.NO_BORDER);
            /*table_cabecera.addCell(cell);*/
          
            cell = new PdfPCell(new Phrase( "__________________" ));
            cell.setPadding(15f);//espaciado a todos los lados
            cell.setColspan(2);
            cell.setHorizontalAlignment(PdfCell.ALIGN_CENTER);
            cell.setBorder(PdfPCell.NO_BORDER);
            /*table_cabecera.addCell(cell);*/

            logger.debug(" SESSION = " + us.getNpepoIdentificador()+" CREADOR = " + rtsbean.getNrtpe_usuariocreacion());
            if( ! (us.getNpepoIdentificador()+"").equals( rtsbean.getNrtpe_usuariocreacion() ) ){

                PersonalBean ptem = PersonalDespachador.obtenerPersonalPolicial(  Integer.parseInt( rtsbean.getNrtpe_usuariocreacion() )  );
                String grad =  ptem != null ?  ptem.getCgrad_descripcion() : " ";
                String nom = ptem != null ? ptem.getNombreCompleto() : " Anonimo ";
                cell = new PdfPCell(new Phrase( "Realizado por " + Utiles.nullToBlank( grad )+ " " + nom +" FECHA: " + Utiles.DateToString(rtsbean.getDrtpe_fechacreacion(), "dd/MM/yyyy HH:mm:ss aa ") ));
                cell.setPadding(20f);
                cell.setColspan(4);
                cell.setHorizontalAlignment(PdfCell.ALIGN_CENTER);
                cell.setBorder(PdfPCell.NO_BORDER);
                table_cabecera.addCell(cell);
                //TODO: graba log auditoria
                RtsDespachador.insertaLogConsulta( us.getCusuaUsername() );
                
            }

        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return table_cabecera;
    }

    public static PdfPCell agregaCeldaLineaCompleta(){
        Graphic horizontalLine = new Graphic();
        horizontalLine.setHorizontalLine(1f, 100f);
        PdfPCell c430 = new PdfPCell(new Phrase (" "));
        c430.setColspan(4);
        c430.setPadding(8f);
        c430.setBorder(PdfPCell.NO_BORDER);
        c430.addElement(horizontalLine);
        return  c430 ;
    }

    /**
     * Cada vez que se hallanm acumulado dias, meses o anios se debe ejecutar
     * este metodo para que complete los dias sobrantes como un nuevo mes
     * @param dias
     * @param mes
     * @param anio
     * @return arreglo con los nuevos numeros
     */
    public static int[] acomodaTtoal(Integer dias, Integer mes, Integer anio){
        int[] numeros = new int[3];
    
        mes += dias / 30;
        dias = dias % 30;
        anio += mes / 12;
        mes = mes % 12;
        if (dias < 0 || mes < 0 || anio < 0) {
            if (dias < 0) {
                mes--;
                dias = 30 + dias;
            }
            if (mes < 0) {
                anio--;
                mes = 12 + mes;
            }
        }
       numeros[PDF_DIA]=dias;
       numeros[PDF_MES]=mes;
       numeros[PDF_ANIO]=anio;
        return numeros;
    }
    /**No importa realment el orden, caulquier campo lo pone tal cual lo recibe */
    public static String imprimeTiempo(Integer anio, Integer mes, Integer dia){
        return " " + Utiles.formatonumero(anio,"00") + " - " +Utiles.formatonumero(mes,"00")+ " - " + Utiles.formatonumero(dia,"00")+" ";
    }

    public static String imprimeTiempoResumen(Integer anio, Integer mes, Integer dia){
        return " (" + Utiles.formatonumero(anio,"00") + ") (" +Utiles.formatonumero(mes,"00")+ ") (" + Utiles.formatonumero(dia,"00")+") ";
    }
}
